package com.bicon.botu.finance.payment.weixin.api;


import com.bicon.botu.finance.payment.common.PaymentConstants;
import com.bicon.botu.finance.payment.weixin.utils.HttpUtil;

import java.util.Map;

/**
 * @author Javen
 *         2017年4月15日
 *         服务商模式、商户模式接口相同只是请求参数不同
 */
public class WxPayApi {
    //统一下单接口
    private static final String UNIFIEDORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    //订单查询
    private static final String ORDERQUERY_URL = "https://api.mch.weixin.qq.com/pay/orderquery";
    //关闭订单
    private static final String CLOSEORDER_URL = "https://api.mch.weixin.qq.com/pay/closeorder";
    //撤销订单
    private static final String REVERSE_URL = "https://api.mch.weixin.qq.com/secapi/pay/reverse";
    //申请退款
    private static final String REFUND_URL = "https://api.mch.weixin.qq.com/secapi/pay/refund";
    //查询退款
    private static final String REFUNDQUERY_URL = "https://api.mch.weixin.qq.com/pay/refundquery";
    //下载对账单
    private static final String DOWNLOADBILLY_URL = "https://api.mch.weixin.qq.com/pay/downloadbill";
    //交易保障
    private static final String REPORT_URL = "https://api.mch.weixin.qq.com/payitil/report";
    //转换短链接
    private static final String SHORT_URL = "https://api.mch.weixin.qq.com/tools/shorturl";
    //授权码查询openId接口
    private static final String AUTHCODETOOPENID_URL = "https://api.mch.weixin.qq.com/tools/authcodetoopenid";
    //刷卡支付
    private static final String MICROPAY_URL = "https://api.mch.weixin.qq.com/pay/micropay";
    //企业付款
    private static final String TRANSFERS_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
    //查询企业付款
    private static final String GETTRANSFERINFO_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo";

    public static final String certPath="";
    public static final String certPassword="";

    private WxPayApi() {
    }

    /**
     * 交易类型枚举
     *
     * @author Javen
     *         2017年4月15日
     *         JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付，统一下单接口trade_type的传参可参考这里
     *         MICROPAY--刷卡支付，刷卡支付有单独的支付接口，不调用统一下单接口
     */
    public static enum TradeType {
        JSAPI, NATIVE, APP, WAP, MICROPAY
    }

    /**
     * 统一下单
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=9_1
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
     * @param params
     * @return
     */
    public static String pushOrder(String params) {
        return doPost(UNIFIEDORDER_URL, params);
    }

    /**
     * 统一下单
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=9_1
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
     * @param params
     * @param certPath
     * @param certPassword
     * @return
     */
    public static String pushOrder(String params, String certPath, String certPassword) {
        return doPostSSL(UNIFIEDORDER_URL,params,certPath,certPassword);
    }

    /**
     * 订单查询
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_2
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_2
     *
     * @param params 请求参数
     * @return
     */
    public static String orderQuery(String params, String certPath, String certPassword) {
        return doPostSSL(ORDERQUERY_URL, params,certPath,certPassword);
    }

    /**
     * 关闭订单
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=9_3
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3
     *
     * @param params
     * @return
     */
    public static String closeOrder(Map<String, String> params) {
        return doPost(CLOSEORDER_URL, params);
    }

    /**
     * 撤销订单
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_11&index=3
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_11&index=3
     *
     * @param params   请求参数
     * @param certPath 证书文件目录
     * @param certPass 证书密码
     * @return
     */
    public static String orderReverse(String params, String certPath, String certPass) {
        return doPostSSL(REVERSE_URL, params, certPath, certPass);
    }

    /**
     * 申请退款
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_4
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_4
     *
     * @param params   请求参数
     * @param certPath 证书文件目录
     * @param certPass 证书密码
     * @return
     */
    public static String orderRefund(String params, String certPath, String certPass) {
        return doPostSSL(REFUND_URL, params, certPath, certPass);
    }

    /**
     * 查询退款
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_5
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_5
     *
     * @param params 请求参数
     * @return
     */
    public static String orderRefundQuery(Map<String, String> params) {
        return doPost(REFUNDQUERY_URL, params);
    }

    /**
     * 下载对账单
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_6
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_6
     *
     * @param params 请求参数
     * @return
     */
    public static String downloadBill(Map<String, String> params) {
        return doPost(DOWNLOADBILLY_URL, params);
    }

    /**
     * 交易保障
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_14&index=7
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_14&index=7
     *
     * @param params 请求参数
     * @return
     */
    public static String orderReport(Map<String, String> params) {
        return doPost(REPORT_URL, params);
    }

    /**
     * 转换短链接
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_9&index=8
     * 商户模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_9&index=8
     *
     * @param params 请求参数
     * @return
     */
    public static String toShortUrl(Map<String, String> params) {
        return doPost(SHORT_URL, params);
    }

    /**
     * 授权码查询openId
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_12&index=9
     * 商户模式接入文档: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_13&index=9
     *
     * @param params 请求参数
     * @return
     */
    public static String authCodeToOpenid(Map<String, String> params) {
        return doPost(AUTHCODETOOPENID_URL, params);
    }

    /**
     * 刷卡支付
     * 服务商模式接入文档:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_10&index=1
     * 商户模式接入文档: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1
     *
     * @param params 请求参数
     * @return
     */
    public static String micropay(Map<String, String> params) {
        return WxPayApi.doPost(MICROPAY_URL, params);
    }

    /**
     * 企业付款
     *
     * @param params       请求参数
     * @param certPath     证书文件目录
     * @param certPassword 证书密码
     * @return {String}
     */
    public static String transfers(String params, String certPath, String certPassword) {
        return WxPayApi.doPostSSL(TRANSFERS_URL, params, certPath, certPassword);
    }

    /**
     * 查询企业付款
     *
     * @param params       请求参数
     * @param certPath     证书文件目录
     * @param certPassword 证书密码
     * @return {String}
     */
    public static String getTransferInfo(String params, String certPath, String certPassword) {
        return WxPayApi.doPostSSL(GETTRANSFERINFO_URL, params, certPath, certPassword);
    }


    public static String doPost(String url, String params) {
        return HttpUtil.sendPostUrl(url, params, PaymentConstants.CHARSET);
    }

    public static String doPost(String url, Map<String, String> params) {
        return HttpUtil.sendPost(url, params, PaymentConstants.CHARSET);
    }

    public static String doPostSSL(String url, String param, String certPath, String certPass) {
        return HttpUtil.postSSL(url, param, PaymentConstants.CHARSET,certPath,certPass);
    }

}
